﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Practices.Unity;
using Autocentro.Entities;
using Autocentro.BussinesLogic;
using System.IO;
using System.Security.Cryptography;
using System.Text.RegularExpressions;

namespace Autocentro.UI
{
    public partial class FrmMttTrabajador : Form
    {
        [Dependency]
        public ITrabajadorBL trabajadorBL { get; set; }

        [Dependency]
        public IImagenTrabajadorBL imagenTrabajadorBL { get; set; }

        bool IsNew = true;

        public FrmMttTrabajador()
        {
            InitializeComponent();
            this.BuildUp();
        }

        private void FrmMttTrabajador_Load(object sender, EventArgs e)
        {

        }

        byte[] pic = null;
        
        StringBuilder sb = new StringBuilder();

        public TRABAJADOR _trabajador { get; set; }

        public void AddTrabajador()
        {
            IsNew = true;
            tRABAJADORBindingSource.AddNew();
            DeshabilitarCampos(); 
        }

        public void HabilitarCampos()
        {
            nombresTextBox.ReadOnly = false;
            apMateroTextBox.ReadOnly = false;
            apPaternoTextBox.ReadOnly = false;
            direccionTextBox.ReadOnly = false;
            telefonoTextBox.ReadOnly = false;
            btnBuscarImg.Enabled = true;
            btnBuscarImg.Enabled = true;
        }

        private void DeshabilitarCampos()
        {
            nombresTextBox.ReadOnly = true;
            apPaternoTextBox.ReadOnly = true;
            apMateroTextBox.ReadOnly = true;
            direccionTextBox.ReadOnly = true;
            telefonoTextBox.ReadOnly = true;
            btnBuscarImg.Enabled = false;
        }

        public void UpdateTrabajador()
        {
            IsNew = false;
            tRABAJADORBindingSource.DataSource = _trabajador;
            var img = imagenTrabajadorBL.GetTrabajadorIamgenById(_trabajador.Id);
            _trabajador.ImagenTrabajador = img;

            if (img.Imagen!=null)
            {
                MemoryStream stream = new MemoryStream(img.Imagen);
                imagenPictureBox.Image = Image.FromStream(stream);
            }
            else
            {
                imagenPictureBox.Image = imagenPictureBox.ErrorImage;
            }
        }
        
        private void btnGuardar_Click(object sender, EventArgs e)
        {
            TRABAJADOR trabajador = tRABAJADORBindingSource.Current as TRABAJADOR;
            var ima = imagenPictureBox.Image;

            var msg = "ERROR";

            if (trabajador!=null)
            {
                trabajador.Dni = dniTextBox.Text.ToUpper();
                trabajador.Nombres = nombresTextBox.Text.ToUpper();
                trabajador.apPaterno = apPaternoTextBox.Text.ToUpper();
                trabajador.apMatero = apMateroTextBox.Text.ToUpper();
                trabajador.Direccion = direccionTextBox.Text.ToUpper();

                if (trabajador.Dni.Length > 0)
                {
                    #region NUEVO
                    if (IsNew)
                    {
                        try
                        {
                            if (imagenPictureBox.Image != null)
                            {
                                ObtenerImg();
                                var imagen = new IMAGEN_TRABAJADOR()
                                {
                                    Imagen = pic,
                                    Hash = sb.ToString(),
                                    tImagenId = trabajador.Id
                                };
                                trabajador.ImagenTrabajador = imagen;
                                trabajadorBL.AddTrabajador(trabajador);
                                MessageBox.Show("Registro Correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                this.Close();
                            }
                            else
                            {
                                var rpt = MessageBox.Show(this, "¿Seguro que desea guardar el Trabajador sin una imagen?", "Mensaje",
                                 MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                                if (rpt == DialogResult.Yes)
                                {
                                    var imagen = new IMAGEN_TRABAJADOR()
                                    {
                                        tImagenId = trabajador.Id
                                    };
                                    trabajador.ImagenTrabajador = imagen;
                                    trabajadorBL.AddTrabajador(trabajador);
                                    MessageBox.Show("Registro Correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                    Close();
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            msg = ex.Message;
                            MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                    #endregion

                    #region UPDATE
                    else
                    {
                        try
                        {
                            if (imagenPictureBox.Image != null)
                            {
                                ObtenerImg();
                                var imagen = new IMAGEN_TRABAJADOR()
                                {
                                    tImagenId = trabajador.Id,
                                    Imagen = pic,
                                    Hash = sb.ToString()
                                };
                                trabajador.ImagenTrabajador = imagen;
                                trabajadorBL.UpdateTrabajador(trabajador);
                                UpdateTrabajador();
                                MessageBox.Show("Modificación Correcta.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                Close();
                            }
                        }
                        catch (Exception ex)
                        {
                            msg = ex.Message;
                            MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                    #endregion
                }
                else
                    MessageBox.Show(this, "Ingrese un número de DNI", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void btnBuscarImg_Click(object sender, EventArgs e)
        {
            this.openFileDialog1.ShowDialog();
        }

        private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
        {
            this.imagenPictureBox.Image = Image.FromFile(this.openFileDialog1.FileName);
        }

        private void ObtenerImg()
        {
            sb = new StringBuilder();
            MemoryStream stream = new MemoryStream();
            imagenPictureBox.Image.Save(stream,System.Drawing.Imaging.ImageFormat.Jpeg);
            pic = stream.ToArray();

            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            byte[] hash = md5.ComputeHash(pic);

            foreach (byte b in hash)
            {
                sb.Append(b.ToString("x2").ToUpper());
            }
        }

        private void dniTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (dniTextBox.Text.Length > 0)
                {
                    if (dniTextBox.Text.Length == 8)
                    {
                        VerificarDNI();
                    }
                    else
                    {
                        MessageBox.Show(this, "Longitud de DNI incorrecta", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        dniTextBox.Focus();
                    }
                }
                else
                    MessageBox.Show(this, "Ingrese un número de DNI", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void dniTextBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Tab)
            {
            }
        }

        private void btnOk_Click(object sender, EventArgs e)
        {
            if (dniTextBox.Text.Length > 0)
            {
                if (dniTextBox.Text.Length == 8)
                {
                    VerificarDNI();
                }
                else
                {
                    MessageBox.Show(this, "Longitud de DNI incorrecta", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    dniTextBox.Focus();
                }
            }
            else
                MessageBox.Show(this, "Ingrese un número de DNI", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void VerificarDNI()
        {
            if (IsNew == true)
            {
                var dniExist = trabajadorBL.GetTrbajadorByDni(dniTextBox.Text);

                if (dniExist != null)
                {
                    tRABAJADORBindingSource.DataSource = dniExist;

                    DialogResult rpta = MessageBox.Show(this, string.Format("Ya existe un Trabajador con el mismo DNI"),
                        "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    if (rpta == DialogResult.OK && IsNew == true)
                    {
                        Close();
                    }
                }
                else
                {
                    MessageBox.Show(this, "DNI disponible", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    HabilitarCampos();
                }
            }
            else
            {
                var _trabajador = tRABAJADORBindingSource.Current as TRABAJADOR;
                var existe = trabajadorBL.ExisteDuplicidadTrabajador(dniTextBox.Text, _trabajador.Id);

                if (existe)
                {
                    DialogResult rpta = MessageBox.Show(this, string.Format("Ya existe un Trabajador con el mismo DNI"),
                        "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show(this, "DNI disponible", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void dniTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void nombresTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsLetter(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void apPaternoTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsLetter(e.KeyChar) )
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void apMateroTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsLetter(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void telefonoTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            var numeral = Convert.ToString("#");
            var asterisc = Convert.ToString("*");
            var guion = Convert.ToString("-");

            var coma = Convert.ToString(",");

            string cadena = numeral + guion + asterisc + (char)8;
            //if (Char.IsLetterOrDigit || (Char.IsNumber(e.KeyChar)) || cadena.Contains(e.KeyChar))
            if ((Char.IsNumber(e.KeyChar)) || cadena.Contains(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void direccionTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            var numeral = Convert.ToString("#");
            var guion = Convert.ToString("-"); 
            var coma = Convert.ToString(",");

            string cadena = numeral + guion + coma + (char)8;

            if (Char.IsLetter(e.KeyChar) || char.IsNumber(e.KeyChar) || cadena.Contains(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void dniTextBox_Leave(object sender, EventArgs e)
        {
            if (dniTextBox.Text.Length > 0)
            {
                if (dniTextBox.Text.Length == 8)
                {
                    VerificarDNI();
                }
                else
                {
                    MessageBox.Show(this, "Longitud de DNI incorrecta", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    dniTextBox.Focus();
                }
            }
            else
                MessageBox.Show(this, "Ingrese un número de DNI", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }



        

       
    }
}
